package furns.service.impl;

import furns.dao.FurnDAO;
import furns.dao.OrderDAO;
import furns.dao.OrderItemDAO;
import furns.dao.impl.FurnDAOImpl;
import furns.dao.impl.OrderDAOImpl;
import furns.dao.impl.OrderItemDAOImpl;
import furns.entity.*;
import furns.service.OrderService;

import java.util.*;

@SuppressWarnings("all")
public class OrderServiceImpl implements OrderService {
    //创建一个OrderDAOImpl对象
    private OrderDAO orderDAO = new OrderDAOImpl();
    //创建一个OrderItemDAOImpl对象
    private OrderItemDAO orderItemDAO = new OrderItemDAOImpl();
    //创建一个FurnDAOImpl对象。父类接口引用子类对象
    private FurnDAO furnDAO = new FurnDAOImpl();
    /**
     * 将cart购物车中的数据 以 order和orderItem的形式保存到数据库中
     * @param cart  订单是根据cart来生成的。cart对象在session中，通过web层传入saveOrder方法
     * @param memberId   每一个cart对象 都对应 一个会员memberId
     * @return
     *说明：生成订单操作会涉及到多张表，因此会涉及到多表事务的问题。后续使用ThreadLocal + Mysql事务机制 + 过滤器 进行解决
     */
    @Override
    public String saveOrder(Cart cart, int memberId) {
        //1、通过cart对象，构建对应的order对象
        //（1）生成一个UUID，表示当前的订单号。该订单号必须保证唯一
        String orderId = System.currentTimeMillis() + "" + memberId;
        Order order = new Order(orderId, new Date(), cart.getCartTotalPrice(), 0, memberId);
        //（2）、将order对象保存到数据表
        orderDAO.saveOrder(order);

        //遍历方式一：2、通过cart对象，遍历出每一个cartItem对象，构建对应的orderItem对象。并将orderItem对象保存到数据表
        //（1）先得到cart对象的cartItem集合,并遍历
        HashMap<Integer, CartItem> items = cart.getItems();
        Set<Integer> keys = items.keySet();  //得到集合中的所有 key
//        System.out.println("keys:" + keys);
        for (Integer id : keys) {
            CartItem item = items.get(id);  //根据key得到每一个CartItem对象
            //根据CartItem对象，构建OrderItem对象
            OrderItem orderItem = new OrderItem(null, item.getName(), item.getPrice(), item.getCount(), item.getTotalPrice(), orderId);
            //将orderItem对象保存到数据表
            orderItemDAO.saveOrderItem(orderItem);
            //更新furn表中相应商品的信息。销量 sales 和 库存 stock
            //(1)根据id得到相应的furn对象
            Furn furn = furnDAO.queryFurnById(id);
            //（2）更新furn表中的sales和stock字段
            furn.setSales(furn.getSales() + item.getCount());
            furn.setStock(furn.getStock() - item.getCount());
            //（3）同时将数据表中的furn信息进行修改
            furnDAO.updateFurn(furn);
        }
        //遍历方式二
//        for (Map.Entry<Integer, CartItem> entry : cart.getItems().entrySet()) {
//            CartItem item = entry.getValue();
//            //通过cartItem对象构建了OrderItem
//            OrderItem orderItem = new OrderItem(null, item.getName(), item.getPrice(),
//                    item.getCount(), item.getTotalPrice(), orderId);
//
//            //保存
//            orderItemDAO.saveOrderItem(orderItem);
//
//            //更新一把furn表的sales销量, stock存量
//            //(1) 获取到furn对象
//            Furn furn = furnDAO.queryFurnById(item.getId());
//            //(2) 更新一下这个furn的sales销量, stock存量
//            furn.setSales(furn.getSales() + item.getCount());
//            furn.setStock(furn.getStock() - item.getCount());
//            //(3) 更新到数据表
//            furnDAO.updateFurn(furn);
//
//        }

        //3、订单保存后清空购物车，避免造成重复提交订单
        cart.clear();
        return orderId;
    }

    @Override
    public List<Order> queryOrderByMemberId(Integer memberId) {
        //根据memberId查询订单
        List<Order> orders = orderDAO.queryOrderByMemberId(memberId);
        return orders;
    }

    @Override
    public List<OrderItem> queryOrderItemByOrderId(String orderId) {
        //根据orderId查询订单项
        List<OrderItem> orderItems = orderItemDAO.queryOrderItemByOrderId(orderId);
        return orderItems;
    }
}
